//package com.ming.liteflow.core.el;
//
//import com.ming.liteflow.core.graph.GraphEL;
//import com.ming.liteflow.core.graph.Node;
//
//import java.util.*;
//import java.util.function.Function;
//
//public class FlowConvert {
//
//    public static FlowNode logicFlow(GraphEL graphEL){
//        FlowNode flowNode = new FlowNode();
//        //完全并行
//        if(graphEL.getList().values().stream().allMatch(m -> m.size() == 0)){
//            flowWhen(flowNode,null, null, graphEL);
//            return flowNode;
//        }
//        Node startNode = graphEL.getStartNode();
//        //完全串行
//        if(getForkNode(startNode, graphEL.getList()) == null){
//            flowThen(flowNode,null, null, graphEL);
//            return flowNode;
//        }
//        //嵌套
//        flow(flowNode, startNode, graphEL);
//        return flowNode;
//    }
//
//    public static void flow(FlowNode flowNode, Node currNode, GraphEL graphEL){
//        if(currNode == graphEL.getEndNode()){
//            return;
//        }
//        Map<Node, List<Node>> nodeMap = graphEL.getList();
//        Node forkNode = getForkNode(currNode, nodeMap);
//        if(currNode == forkNode || forkNode == null){
//            forkNode = getJoinNode(currNode, graphEL);
//        }
//        Node startNode = currNode;
//        Node endNode = forkNode;
//        List<Node> nodes = nodeMap.get(startNode);
//        if(nodes.size() > 1){
//            System.out.println("WHEN:"+startNode.getProperties().getComponentId()+" -> "+endNode.getProperties().getComponentId());
//            flowWhen(flowNode,startNode,endNode,graphEL);
//        }else{
//            System.out.println("THEN:"+startNode.getProperties().getComponentId()+" -> "+endNode.getProperties().getComponentId());
//            flowThen(flowNode,startNode,endNode,graphEL);
//        }
//        flow(flowNode, forkNode, graphEL);
//    }
//
//    public static void flowThen(FlowNode flowNode, Node startNode, Node endNode, GraphEL graphEL){
//        if(startNode == null && endNode == null){
//            List<Node> list = new ArrayList<>(graphEL.getList().keySet());
//            createFlowNode(flowNode, list, "THEN");
//        }else{
//            List<Node> list = getStartEndNode(startNode, endNode, graphEL);
//            createFlowNode(flowNode, list, "THEN");
//        }
//    }
//
//    public static void flowWhen(FlowNode flowNode, Node startNode, Node endNode, GraphEL graphEL){
//        if(startNode == null && endNode == null){
//            List<Node> list = new ArrayList<>(graphEL.getList().keySet());
//            createFlowNode(flowNode, list, "WHEN");
//        }else{
//            List<List<Node>> allPaths = graphEL.getAllPaths(startNode, endNode, true);
//            for (List<Node> nodeList : allPaths){
//                boolean isThen = graphEL.isThen(nodeList);
//                FlowNode flowNodeChildren = new FlowNode();
//                if(isThen){
//                    createFlowNode(flowNodeChildren, nodeList, "THEN");
//                }else{
//
//                }
//                System.out.println();
//            }
//        }
//    }
//
//    public static <T> boolean isPropertyAllEqual(List<T> list, Function<T, Object> getProperty, Object value) {
//        return list.stream().allMatch(item -> getProperty.apply(item).equals(value));
//    }
//
//    public static void createFlowNode(FlowNode flowNode, List<Node> nodeList, String type){
//        FlowNode flowNode1 = createFlowNode(nodeList, type);
//        List<FlowNode> list = flowNode1.getList();
//        boolean isType = isPropertyAllEqual(list, FlowNode::getType, type);
//        if(isType){
//            flowNode.setType(type);
//        }
//        if(flowNode.getList() != null){
//            flowNode.getList().addAll(new ArrayList<FlowNode>(){{add(flowNode1);}});
//        }else{
//            flowNode.setList(new ArrayList<FlowNode>(){{add(flowNode1);}});
//        }
//    }
//
//    public static void createFlowNode(FlowNode flowNode, List<Node> nodeList, String type, List<FlowNode> nodes){
//        FlowNode flowNode1 = createFlowNode(nodeList, type);
//        List<FlowNode> list = flowNode1.getList();
//        boolean isType = isPropertyAllEqual(list, FlowNode::getType, type);
//        if(isType){
//            flowNode.setType(type);
//        }
//        nodes.add(flowNode1);
//        flowNode.setList(nodes);
//    }
//
//    public static FlowNode createFlowNode(List<Node> nodeList,String type){
//        FlowNode flowNode = new FlowNode();
//        List<FlowNode> list = new ArrayList<>();
//        for (Node node : nodeList){
//            list.add(createFlowNode(node, type));
//        }
//        flowNode.setList(list);
//        boolean isType = isPropertyAllEqual(list, FlowNode::getType, type);
//        if(isType){
//            flowNode.setType(type);
//        }
//        return flowNode;
//    }
//
//    public static FlowNode createFlowNode(Node node, String type){
//        FlowNode flowNode = new FlowNode();
//        flowNode.setType(type);
//        flowNode.setCmpId(node.getProperties().getComponentId());
//        return flowNode;
//    }
//
//    // 获取 分叉节点 -> 聚合节点
//    public static List<Node> getForkJoinNode(Node forkNode,Node joinNode,GraphEL graphEL){
//        return graphEL.getCommonNodesInAllPaths(forkNode,joinNode);
//    }
//
//    //获取 开始节点 -> 结束节点
//    public static List<Node> getStartEndNode(Node startNode,Node endNode,GraphEL graphEL){
//        Map<Node, List<Node>> map = graphEL.getList();
//        List<Node> nodeList = new ArrayList<>();
//        if(startNode == endNode){
//            nodeList.add(startNode);
//        }else{
//            while (startNode != endNode){
//                nodeList.add(startNode);
//                startNode = map.get(startNode).get(0);
//            }
//            nodeList.add(endNode);
//        }
//        return nodeList;
//    }
//
//    // 当前节点 -> 分叉节点
//    public static Node getForkNode(Node currNode,Map<Node, List<Node>> nodeMap){
//        List<Node> list = nodeMap.get(currNode);
//        if(list.size() == 1){
//            return getForkNode(list.get(0), nodeMap);
//        }else if(list.size() == 0){
//            return null;
//        }
//        return currNode;
//    }
//
//    // 分叉节点 -> 聚合节点
//    public static Node getJoinNode(Node currNode,GraphEL graphEL){
//        return graphEL.getJoinNode(currNode);
//    }
//
//}
